﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


namespace DiaryPlanner
{
    public partial class PhotoViewer : Form
    {   
        public Album thisAlbumObject;
        public int index;//photolist index
        public int count;

        public PhotoViewer(Album ab)
        {
            thisAlbumObject = ab;
            InitializeComponent();
            skinSet();

            photoMemo.Text = ab.nowPhoto.photoMemo;
            nowPhoto.Image = ab.nowPhoto.Image;
            nowPhoto.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;

            btnCancel.Visible = false;
            btnOk.Visible = false;

            count = thisAlbumObject.nowFolder.PhotoList.Count;
            foreach (AlbumPhoto ap in thisAlbumObject.nowFolder.PhotoList)
            {
                if (thisAlbumObject.nowPhoto != ap)
                {
                    index++;
                }
                else{
                    //nowphoto                                      
                    break;
                }
            }            
        }
        public void skinSet()
        {
            string skin = UserProfile.Instance().setting;
            if (skin == "b")
            {
                this.BackColor = System.Drawing.Color.PaleTurquoise;

            }
            else if (skin == "c")
            {
                this.BackColor = System.Drawing.Color.LawnGreen;
            }
            else if (skin == "d")
            {
                this.BackColor = System.Drawing.Color.MistyRose;

            }
            else
            { //skin=="a"
                this.BackColor = System.Drawing.SystemColors.ControlLight;

            }
        }

        private void pictureBox1_Click(object sender, EventArgs e)//다음 이미지 버튼
        {                               
                if (index+1 < count)
                {
                    index++;//다음 index
                    AlbumPhoto apt = thisAlbumObject.nowFolder.PhotoList[index] as AlbumPhoto;
                    thisAlbumObject.nowPhoto = apt;

                    //view
                    nowPhoto.Image = apt.Image;
                    photoMemo.Text = apt.photoMemo;                  
                }   
        }

        private void pictureBox2_Click(object sender, EventArgs e)
        {
            if (index - 1 >=0)
            {
                index--;//이전 index
                AlbumPhoto apt = thisAlbumObject.nowFolder.PhotoList[index] as AlbumPhoto;
                thisAlbumObject.nowPhoto = apt;

                //view
                nowPhoto.Image = apt.Image;
                photoMemo.Text = apt.photoMemo;
                
            }
            
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {

            PhotoDeleteCheck pdc = new PhotoDeleteCheck(thisAlbumObject);
            pdc.ShowDialog();
            pdc = null;
            if (thisAlbumObject.photoDeleteChecker == false)
            {
                return;
            }            

            this.nowPhoto.Image = null;
            this.photoMemo.Text = null;
            thisAlbumObject.nowPhoto.photoDeleteExecute();            


            count--;
            if (count == 0) {                
                this.Close();                
                return;
            }

            //index
            if (index == count) //삭제한 사진이 마지막 사진인 경우
            {
                index--;
            }            

            AlbumPhoto apt = thisAlbumObject.nowFolder.PhotoList[index] as AlbumPhoto;
            thisAlbumObject.nowPhoto = apt;

            //view            
            nowPhoto.Image = apt.Image;
            photoMemo.Text = apt.photoMemo;
            nowPhoto.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;      
            
        }

        private void btnEdit_Click(object sender, EventArgs e)//메모수정하기
        {
            this.photoMemo.ReadOnly = false;
            this.photoMemo.BorderStyle = BorderStyle.Fixed3D;


            this.pictureBox1.Enabled = false;
            this.pictureBox2.Enabled = false;

            this.btnEdit.Visible = false;
            this.btnDelete.Visible = false;
            this.btnOk.Visible = true;
            this.btnCancel.Visible = true;


        }

        private void btnOk_Click(object sender, EventArgs e)//메모수정 반영
        {
            this.photoMemo.ReadOnly = true;
            this.photoMemo.BorderStyle = BorderStyle.None;            
            thisAlbumObject.nowPhoto.photoMemo = this.photoMemo.Text;
            //DB 업데이트
            update_db(thisAlbumObject.nowPhoto.photoName, this.photoMemo.Text);

            this.pictureBox1.Enabled = true;
            this.pictureBox2.Enabled = true;

            this.btnEdit.Visible = true;
            this.btnDelete.Visible = true;
            this.btnOk.Visible = false;
            this.btnCancel.Visible = false;
        }

        private void btnCancel_Click(object sender, EventArgs e)//메모수정 취소
        {
            this.photoMemo.Text = thisAlbumObject.nowPhoto.photoMemo;
            this.photoMemo.ReadOnly = true;
            this.photoMemo.BorderStyle = BorderStyle.None;

            this.pictureBox1.Enabled = true;
            this.pictureBox2.Enabled = true;

            this.btnEdit.Visible = true;
            this.btnDelete.Visible = true;
            this.btnOk.Visible = false;
            this.btnCancel.Visible = false;
        }

        //Pname: picname
        //memoText: memo
        private void update_db(string picname, string memo)
        {
            try
            {
                string connectionString = "provider=Microsoft.JET.OLEDB.4.0;" //연결하는 객체의 공급자명(확장자명)
                                         + "data source = "  //데이터 소스=(경로입력하라는거)
                                         + Application.StartupPath ///상대경로 읽어옴
                                         + @"\diaryplannerdb.mdb";//실제 데이터베이스 파일이름

                string commandString = "Select * from [photo]";//memos테이블에 있는 모든필드들을 모두 검색해라.

                OleDbDataAdapter DBAdapter ////DataSet을 채우고 데이터 소스를 업데이트하는 데 사용되는 데이터 명령 집합 및 데이터베이스 연결하게 하는 함수
                    = new OleDbDataAdapter(commandString, connectionString);//connectionString이라는 경로와 쿼리명령을 동적할당

                OleDbCommandBuilder myCommandBuilder ///연결된 데이터베이스에서 DataSet의 변경 내용을 조정하는 데 사용되는 단일 테이블 명령을 자동으로 생성합니다
                    = new OleDbCommandBuilder(DBAdapter);

                DataSet DS = new DataSet(); //DS라는 데이터 셋 동적할당

                DBAdapter.Fill(DS, "photo"); //DS라는 데이터셋에 새로운 memos 테이블에 추가 또는 갱신하겠다고 알림.

                DataTable aTable = DS.Tables["photo"];//memos테이블을 불러와 aTable을 새로 생성해서 저장

                DataColumn[] PrimaryKey = new DataColumn[1];

                PrimaryKey[0] = aTable.Columns["Pname"]; //a컬럼을 기본키를 설정

                aTable.PrimaryKey = PrimaryKey;//기본키 할당

                DataRow currRow = aTable.Rows.Find(picname); //textBox값인 기본키 선택

                currRow.BeginEdit(); //수정을 할 부분 시작 설정
                currRow["memoText"] = memo;                
                currRow.EndEdit(); //수정할 부분 끝 부분 설정

                DataSet UpdateSet = DS.GetChanges(DataRowState.Modified); //데이터 상태를 수정한다.
                if (UpdateSet.HasErrors)
                {
                    MessageBox.Show("변경된 데이터에 문제가 있습니다.");
                }
                else
                {
                    DBAdapter.Update(DS, "photo");
                    DS.AcceptChanges(); //실제 데이터를 생성
                }
            }
            catch (DataException DE)
            {
                MessageBox.Show(DE.Message);
            }
            catch (Exception DE)
            {
                MessageBox.Show(DE.Message);
            }
        }
    }
}
